package com.lwf.thymeleafdemo1.redisTest.service.impl;

import com.lwf.thymeleafdemo1.mysqlTest.dao.PsnInfoBDAO;
import com.lwf.thymeleafdemo1.mysqlTest.entity.PsnInfoBVO;
import com.lwf.thymeleafdemo1.redisTest.service.DepartmentService;
import com.lwf.thymeleafdemo1.utils.MD5Utils;
import com.fasterxml.jackson.databind.ObjectMapper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @version v1.0
 * @Description:
 * RedisTemplate操作Redis
 * @Cacheable：表示当前查询结果会使用缓存。（如果有缓存，直接使用，否则进行数据库查询并放入缓存）
 * @CachePut：表示当前操作的数据的结果会更新到缓存中。（如果修改的数据在缓存存在，会同时修改缓存中的数据）
 * @CacheEvict：表示如果删除的数据在缓存中，也会对应的删除。
 * @Author 李文峰
 * @Date 2023/7/23 0023 10:15
 */
// 相关链接：// https://blog.csdn.net/weixin_45427945/article/details/131276964
@Service("departmentService")
public class DepartmentServiceImpl implements DepartmentService {
    @Autowired
    private PsnInfoBDAO psnInfoBDAO;
    @Resource
    private RedisTemplate redisTemplate;

    @Override
    public PsnInfoBVO findAll(String psnNo) {
        // json处理的对象
        ObjectMapper mapper = new ObjectMapper();
        // 1、查询缓存
        // 定义一个key（唯一、尽量不会被推导）
        // 使用一个唯一的名字 + 参数值 + md5
        String key = MD5Utils.encode("findAllDepartments");
        // 得到redisTemplate中的操作对象
        BoundValueOperations<String, String> boundValueOps = redisTemplate.boundValueOps(key);
        // 得到缓存中的值
        String value = boundValueOps.get();
        System.out.println("value===" + value);
        // 2、判断缓存是否有该数据
        if (value != null){
            // 3、如果有则返回该数据
            System.out.println("查询了缓存");
            PsnInfoBVO sninfobvo = null;
            try {
                sninfobvo = mapper.readValue(value, PsnInfoBVO.class);
            }catch (Exception e){
                e.printStackTrace();
            }
            return sninfobvo;
        }else{
            // 4、如果没有，则去数据库中查询，并保存到缓存中
            System.out.println("查询了数据库");
            PsnInfoBVO departments = psnInfoBDAO.queryById(psnNo);
            if (departments != null){
                // 转换成json格式
                try {
                    String string = mapper.writeValueAsString(departments);
                    // 保存到缓存中
                    boundValueOps.set(string);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            return departments;
        }
    }
}

